<?php

App::import('Sanitize');

class ObstaculosController extends AppController {

    var $name = 'Obstaculos';
    var $paginate = array(
        'order' => array('Obstaculo.id ASC'),
        'limit' => 10,
    );

    function beforeFilter() {
        //parent::beforeFilter();
    }

    function index($obstaculos_tipo_id = null, $obstaculo_id = null) {
        $this->__aux_index($obstaculos_tipo_id, $obstaculo_id);
    }

    function admin_index($obstaculos_tipo_id = null, $obstaculo_id = null) {
        $this->__aux_index($obstaculos_tipo_id, $obstaculo_id);
    }

    /**
     * Lista todos los obstáculos
     */
    function __aux_index($obstaculos_tipo_id = null, $obstaculo_id = null) {
        $this->Obstaculo->recursive = 0;
        $this->paginate['order'] = 'Obstaculo.nombre';

        $condiciones = array();

        $tipos_obstaculos = $this->ObstaculosTipo->find('list', array('fields' => array('ObstaculosTipo.id', 'ObstaculosTipo.nombre'), 'order' => 'ObstaculosTipo.nombre'));
        $tipos_obstaculos['0'] = 'Todos';
        if (!empty ($obstaculos_tipo_id))
            $this->data['Obstaculo']['obstaculos_tipo_id'] = $obstaculos_tipo_id;

        $lista_obstaculos = array();
        if (!empty ($obstaculo_id))
            $this->data['Obstaculo']['obstaculo_id'] = $obstaculo_id;

        $nombre = '';

        //si vienen datos del filtro
        if (!empty($this->data)) {

            if (isset ($this->data['Obstaculo']['obstaculos_tipo_id']) && !empty($this->data['Obstaculo']['obstaculos_tipo_id'])) {
                $condiciones[] = "ObstaculosTipo.id = {$this->data['Obstaculo']['obstaculos_tipo_id']}";
            }

            if (isset ($this->data['Obstaculo']['obstaculos_tipo_id']) && (!empty($this->data['Obstaculo']['obstaculos_tipo_id']) || ($this->data['Obstaculo']['obstaculos_tipo_id'] == '0'))) {
                $obstaculos_tipo_id = $this->data['Obstaculo']['obstaculos_tipo_id'];
                $this->Session->write('obstaculos_tipo_id', $obstaculos_tipo_id);
            }

            if (isset($this->data['Obstaculo']['obstaculo_id']) && !empty($this->data['Obstaculo']['obstaculo_id'])) {
                $condiciones[] = "Obstaculo.id = {$this->data['Obstaculo']['obstaculo_id']}";
            }

            if (isset($this->data['Obstaculo']['obstaculo_id']) && ((!empty($this->data['Obstaculo']['obstaculo_id']) || ($this->data['Obstaculo']['obstaculo_id'] == '0')))) {
                $obstaculo_id = $this->data['Obstaculo']['obstaculo_id'];
                if (!empty($this->data['Obstaculo']['obstaculos_tipo_id'])) {
                    $lista_obstaculos = $this->Obstaculo->find('list', array('conditions' => array('Obstaculo.obstaculos_tipo_id' => $this->data['Obstaculo']['obstaculos_tipo_id']),
                                'fields' => array('Obstaculo.id', 'Obstaculo.nombre')));
                } else {
                    $lista_obstaculos = $this->Obstaculo->find('list', array('fields' => array('Obstaculo.id', 'Obstaculo.nombre')));
                }
                $lista_obstaculos[0] = 'Todos';
                $this->Session->write('obstaculo_id', $obstaculo_id);
                $this->Session->write('lista_obstaculos', $lista_obstaculos);
            }

            if (isset($this->data['Obstaculo']['nombre']) && !empty($this->data['Obstaculo']['nombre'])) {
                $obstaculo = utf8_encode(strtolower(utf8_decode(trim($this->data['Obstaculo']['nombre']))));
                $condiciones[] = "lower(Obstaculo.nombre) LIKE '%{$obstaculo}%'";
                $nombre = $this->data['Obstaculo']['nombre'];
                $this->Session->write('nombre', $nombre);
            }
            $this->Session->write('obstaculos_filter', $condiciones);
        } elseif ($this->Session->check('obstaculos_filter')) {//si tengo cargado un filtro en session
            //me fijo si esta cambiando de pagina o cambiando el limit
            if (isset($this->params['named']['limit']) || isset($this->params['named']['page'])) {
                //si ya estaba siendo aplicado un filtro, lo sigo usando
                $condiciones = $this->Session->read('obstaculos_filter');
                $obstaculos_tipo_id = ($this->Session->check('obstaculos_tipo_id')) ? $this->Session->read('obstaculos_tipo_id') : '';
                $obstaculo_id = ($this->Session->check('obstaculo_id')) ? $this->Session->read('obstaculo_id') : '';
                $lista_obstaculos = ($this->Session->check('lista_obstaculos')) ? $this->Session->read('lista_obstaculos') : array();
                $nombre = ($this->Session->check('nombre')) ? $this->Session->read('nombre') : '';
            } else {
                //sino, lo borro de la session
                $this->Session->delete('obstaculos_filter');
                $this->Session->delete('obstaculos_tipo_id');
                $this->Session->delete('obstaculo_id');
                $this->Session->delete('lista_obstaculos');
                $this->Session->delete('nombre');
            }
        }

        $this->paginate['conditions'] = $condiciones;
        $referer = $this->referer();
        $this->set(compact('lista_obstaculos', 'obstaculo_id', 'tipos_obstaculos', 'obstaculos_tipo_id', 'nombre', 'referer'));
        $this->set('obstaculos', $this->paginate());
        $this->render('index');
    }

    function view_obstaculos($obstaculos_tipo_id = null) {
        $this->__aux_view_obstaculos($obstaculos_tipo_id);
    }

    function admin_view_obstaculos($obstaculos_tipo_id = null) {
        $this->__aux_view_obstaculos($obstaculos_tipo_id);
    }

    /**
     *
     * @param <type> $obstaculos_tipo_id
     */
    function __aux_view_obstaculos($obstaculos_tipo_id = null) {
        $this->layout = false;
        $lista_obstaculos = array();

        if (!empty($obstaculos_tipo_id)) {
            $lista_obstaculos = $this->Obstaculo->find('list', array('conditions' => array('Obstaculo.obstaculos_tipo_id' => $obstaculos_tipo_id),
                        'fields' => array('Obstaculo.id', 'Obstaculo.nombre'), 'order' => 'Obstaculo.nombre'));
        } else {
            $lista_obstaculos = $this->Obstaculo->find('list', array('fields' => array('Obstaculo.id', 'Obstaculo.nombre'), 'order' => 'Obstaculo.nombre'));
        }
        $lista_obstaculos[0] = 'Todos';
        $this->set(compact('obstaculos_tipo_id', 'lista_obstaculos'));
        $this->render('view_obstaculos');
    }

    function delete($id = null) {
        $this->__aux_delete($id);
    }

    function admin_delete($id = null) {
        $this->__aux_delete($id);
    }

    /**
     * Permite eliminar un obstáculo seleccionado si no existen obras de arte que pertenecen a dicho obstáculo
     * @param <type> $id
     */
    function __aux_delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Obstáculo inválido', true), 'flash_failure');
        } else {
            // Chequeo que el obstáculo exista
            $obstaculo = $this->Obstaculo->find('all', array('conditions' => array('Obstaculo.id' => $id)));
            if (!empty($obstaculo)) {
                $obstaculo_name = $obstaculo[0]['Obstaculo']['nombre'];
                // Chequeo si hay obras de arte que pertenecen a ese obstáculo
                $obstaculos = $this->Obra->find('all', array('conditions' => array('Obra.obstaculo_id' => $id)));
                if (!empty($obstaculos)) {
                    $this->Session->setFlash(__('El obstáculo "' . $obstaculo_name . '" no se puede eliminar porque existen obras de arte que pertenecen a dicho obstáculo.', true), 'flash_failure');
                } else {
                    if ($this->Obstaculo->delete($id)) {
                        $this->Session->setFlash(__('El obstáculo "' . $obstaculo_name . '" se eliminó correctamente.', true), 'flash_success');
                    } else {
                        $this->Session->setFlash(__('El obstáculo no se pudo eliminar. Por favor, intente nuevamente.', true), 'flash_failure');
                    }
                }
            } else {
                $this->Session->setFlash(__('Obstáculo inválido', true), 'flash_failure');
            }
        }
        $this->redirect(array('action' => 'admin_index'));
    }

    function add($obstaculos_tipo_id = null) {
        $this->__aux_add($obstaculos_tipo_id);
    }

    function admin_add($obstaculos_tipo_id = null) {
        $this->__aux_add($obstaculos_tipo_id);
    }

    /**
     * Permite dar de alta un nuevo obstáculo
     */
    function __aux_add($obstaculos_tipo_id = null) {
        $obstaculos_tipo_id = (empty($obstaculos_tipo_id)) ? '' : $obstaculos_tipo_id;
        if (!empty($this->data)) {
            $obstaculo_name = utf8_encode(strtolower(utf8_decode(trim($this->data['Obstaculo']['nombre']))));
            $obstaculos_tipo_id = trim($this->data['Obstaculo']['obstaculos_tipo_id']);

            // Chequeo si existe en la db un obstáculo con el mismo nombre y el mismo tipo
            $obstaculo = $this->Obstaculo->find('all', array('conditions' => array('lower(Obstaculo.nombre)' => $obstaculo_name, 'Obstaculo.obstaculos_tipo_id' => $obstaculos_tipo_id)));


            if (empty($obstaculo)) {
                $this->Obstaculo->create();
                if ($this->Obstaculo->save($this->data)) {
                    $obstaculo_id = $this->Obstaculo->id;
                    $this->Session->setFlash(__('El obstáculo se guardó correctamente.', true), 'flash_success');
                    $this->redirect(array('action' => 'admin_index', $obstaculos_tipo_id, $obstaculo_id));
                } else {
                    $this->Session->setFlash(__('El obstáculo no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                }
            } else {
                $obstaculo_tipo = $this->Obstaculo->ObstaculosTipo->find('all', array('conditions' => array('ObstaculosTipo.id' => $obstaculos_tipo_id)));
                $obstaculo_tipo_name = $obstaculo_tipo[0]['ObstaculosTipo']['nombre'];
                $this->Session->setFlash(__('El obstáculo "' . $this->data['Obstaculo']['nombre'] . '" del tipo "' . $obstaculo_tipo_name . '" ya existe.', true), 'flash_failure');
            }
        }
        $obstaculosTipos = $this->Obstaculo->ObstaculosTipo->find('list', array('fields' => array('ObstaculosTipo.id', 'ObstaculosTipo.nombre'), 'order' => 'ObstaculosTipo.nombre'));

        $referer = $this->referer();
        $this->set(compact('obstaculosTipos', 'obstaculos_tipo_id', 'referer'));
        $this->render('add');
    }

    function edit($id = null) {
        $this->__aux_edit($id);
    }

    function admin_edit($id = null) {
        $this->__aux_edit($id);
    }

    /**
     * Permite editar un obstáculo existente
     */
    function __aux_edit($id = null) {
        $obstaculos_tipo_id = 0;
        if (empty($id) && empty($this->data)) {
            $this->Session->setFlash(__('Obstáculo inválido', true), 'flash_failure');
            $this->redirect(array('action' => 'admin_index'));
        } elseif (empty($this->data)) {
            $this->data = $this->Obstaculo->read(null, $id);
            $obstaculos_tipo_id = $this->data['Obstaculo']['obstaculos_tipo_id'];
        } elseif (!empty($this->data)) {
            $obstaculo_name = utf8_encode(strtolower(utf8_decode(trim($this->data['Obstaculo']['nombre']))));
            $obstaculos_tipo_id = trim($this->data['Obstaculo']['obstaculos_tipo_id']);
            // Chequeo si existe en la db un obstáculo con el mismo nombre y el mismo tipo
            $obstaculo = $this->Obstaculo->find('all', array('conditions' => array("Obstaculo.id <>" => $id, 'lower(Obstaculo.nombre)' => $obstaculo_name, 'Obstaculo.obstaculos_tipo_id' => $obstaculos_tipo_id)));
            if (empty($obstaculo)) {
                if ($this->Obstaculo->save($this->data)) {
                    $this->Session->setFlash(__('El obstáculo se guardó correctamente.', true), 'flash_success');
                    $this->redirect(array('action' => 'admin_index', $obstaculos_tipo_id, $id));
                } else {
                    $this->Session->setFlash(__('El obstáculo no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                }
            } else {
                $obstaculo_tipo = $this->Obstaculo->ObstaculosTipo->find('all', array('conditions' => array('ObstaculosTipo.id' => $obstaculos_tipo_id)));
                $obstaculo_tipo_name = $obstaculo_tipo[0]['ObstaculosTipo']['nombre'];
                $this->Session->setFlash(__('El obstáculo "' . $this->data['Obstaculo']['nombre'] . '" del tipo "' . $obstaculo_tipo_name . '" ya existe.', true), 'flash_failure');
            }
        }
        $obstaculosTipos = $this->Obstaculo->ObstaculosTipo->find('list', array('fields' => array('ObstaculosTipo.id', 'ObstaculosTipo.nombre'), 'order' => 'ObstaculosTipo.nombre'));
        $referer = $this->referer();
        $this->set(compact('obstaculosTipos', 'obstaculos_tipo_id', 'referer'));
        $this->render('edit');
    }

    //********************************************//
    //***************** MAPA *********************//
    //********************************************//

    function view_obstaculos_mapa($id_tipo_obstaculo = null) {
        $this->__aux_view_obstaculos_mapa($id_tipo_obstaculo);
    }

    function admin_view_obstaculos_mapa($id_tipo_obstaculo = null) {
        $this->__aux_view_obstaculos_mapa($id_tipo_obstaculo);
    }

    /**
     *
     * @param <type> $id_tipo_obstaculo
     */
    function __aux_view_obstaculos_mapa($id_tipo_obstaculo = null) {
        $this->layout = false;
        $lista_obstaculos = array();

        if (!empty($id_tipo_obstaculo)) {
            $lista_obstaculos = $this->Obstaculo->find('list', array('conditions' => array('Obstaculo.obstaculos_tipo_id' => $id_tipo_obstaculo),
                        'fields' => array('Obstaculo.id', 'Obstaculo.nombre'), 'order' => 'Obstaculo.nombre'));
        } else {
            $lista_obstaculos = $this->Obstaculo->find('list', array('fields' => array('Obstaculo.id', 'Obstaculo.nombre'), 'order' => 'Obstaculo.nombre'));
        }
        $lista_obstaculos[0] = 'Todos';
        $this->set(compact('id_tipo_obstaculo', 'lista_obstaculos'));
        $this->render('view_obstaculos_mapa');
    }

}
?>